1 package uba.db.table;
2
3 import java.util.Collections;
4 import java.util.Iterator;
5 import java.util.List;
6
7 import org.apache.commons.collections.CollectionUtils;
8 import org.apache.commons.collections.TransformerUtils;
9
10 import uba.db.column.Column;
11
12 /***
13 * Clase base para facilitar la implementación de la interfaz
14 * {@link uba.db.table.Table}.
15 *
16 * @version $Revision: 1.6 $
17 */
18 public abstract class TableBehavior implements Table {
19 private String name;
20
21 private List columns;
22
23 /***
24 * Las subclases deben llamar a este constructor para crear la estrcutura de
25 * la tabla a partir de un {@link TableSchema}.
26 *
27 * @param schema
28 * esquema de la tabla.
29 */
30 public TableBehavior(TableSchema schema) {
31 this.name = schema.tableName();
32 initializeColumnsFrom(schema);
33 }
34
35 private void initializeColumnsFrom(TableSchema schema) {
36 columns = (List) CollectionUtils
37 .collect(schema.columnSpecifications(), TransformerUtils
38 .invokerTransformer("asColumnFor",
39 new Class[] { Table.class },
40 new Object[] { this }));
41 }
42
43 /***
44 * @see uba.db.table.Table#name()
45 */
46 public String name() {
47 return name;
48 }
49
50 /***
51 * @see uba.db.table.Table#insert(java.lang.Object[])
52 */
53 public void insert(Object[] values) throws IllegalArgumentException, InsertException {
54 insertRow(new Row(this, values));
55 }
56
57 /***
58 * @see uba.db.table.Table#columns()
59 */
60 public List columns() {
61 return Collections.unmodifiableList(columns);
62 }
63
64 /***
65 * Las sub-clases deben implementar este método para insertar una fila en la
66 * tabla.
67 *
68 * @param row
69 * fila a insertar.
70 */
71 protected abstract void insertRow(Row row) throws InsertException;
72
73 /***
74 * @see uba.db.table.Table#numberOfColumns()
75 */
76 public int numberOfColumns() {
77 return columns.size();
78 }
79
80 /***
81 * @see uba.db.table.Table#columnNamed(java.lang.String)
82 */
83 public Column columnNamed(String columnName) {
84
85 return (Column) columns.get(indexOfColumnNamed(columnName) - 1);
86 }
87
88 /***
89 * Da el indice en base 0 para poder hacer cálculos al construir resultados.
90 *
91 * @param columnName
92 * el nombre de la columna
93 * @return el indice en base 1, 0 si no existe en la tabla.
94 */
95 public int indexOfColumnNamed(String columnName) {
96 int i = 0;
97 Iterator it = columns.iterator();
98 Column result = null;
99 while (it.hasNext() && (result == null)) {
100 i++;
101 Column col = (Column) it.next();
102 if (col.name().equalsIgnoreCase(columnName)) {
103 result = col;
104 }
105 }
106 return i;
107 }
108 }